/*
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.server.impl</code> agrupa todas las clases
 * que encapsulan la implementación de los m�todos de acceso RMI y el servidor.
 */
package edu.uoc.tds.pec4.server.impl;

import edu.uoc.tds.pec4.rmi.GestorDiccionarioInterface;
import edu.uoc.tds.pec4.beans.CFisicaDTO;
import edu.uoc.tds.pec4.beans.CiudadDTO;
import edu.uoc.tds.pec4.beans.EquipamientoDTO;
import edu.uoc.tds.pec4.beans.PaisDTO;
import edu.uoc.tds.pec4.beans.ProvinciaDTO;
import edu.uoc.tds.pec4.beans.TipoEncuentroDTO;
import edu.uoc.tds.pec4.beans.TopDTO;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.server.bbdd.DAOFactory;
import edu.uoc.tds.pec4.server.bbdd.IMaestrosDAO;
import edu.uoc.tds.pec4.server.bbdd.exceptions.DAOFactoryException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.DataBaseDAOException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorDiccionarioException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;

/**
 * La clase <code>GestorDiccionarioImpl</code> contiene la implementaci�n de
 * todos los  m�todos indicados en la interfaz <code>GestorDiccionarioInterface</code><br />
 * Clase que implementa todas las funciones remotas que se pueden solicitar por RMI
 * y que tienen que ver con los listados de las tablas maestras. <br />
 *
 * Representa el objeto remoto que se invoca en la comunicaci�n RMI para los 
 * listados de las tablas maestras.
 *
 * @author	Luis Rodríguez-Manzaneque S�nchez
 * @version	24/11/2011
 * @see		edu.uoc.tds.pec4.common.GestorDiccionarioInterface
 */
public class GestorDiccionarioImpl extends UnicastRemoteObject implements GestorDiccionarioInterface {

    /**
     * Constructor
     * @throws	RemoteException en caso de producirse un fallo de comunicaciones
     */
    public GestorDiccionarioImpl() throws RemoteException {
        super();
    }

    /**
     * Devuelve la lista de paises
     * @return  La lista de todos las paises de la aplicaci�n
     * @throws  RemoteException en caso de producirse un fallo de comunicaciones
     * @throws  GestorDiccionarioException En caso de producirse un error en el acceso
     *          a datos
     */
    public List<PaisDTO> listaPaises() throws GestorDiccionarioException, RemoteException {
        List<PaisDTO> paises = new ArrayList<PaisDTO>();
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IMaestrosDAO dao = factory.getMaestrosDAO();
            paises = dao.listaPaises();

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoF) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_PAISES
                    + Constantes.SL + daoF.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_PAISES
                    + Constantes.SL + daoE.getMessage());
        }
        return paises;
    }

    /**
     * Devuelve la lista de provincias
     * @param	idPais El identificador del pais del que se quieren obtener las provincias
     * @return  La lista de las provincias que pertencen al Provincia indicado
     * @throws  RemoteException en caso de producirse un fallo de comunicaciones
     * @throws  GestorDiccionarioException En caso de producirse un error en el acceso
     *          a datos
     */
    public List<ProvinciaDTO> listaProvincias(int idPais) throws GestorDiccionarioException, RemoteException {
        List<ProvinciaDTO> provincias = new ArrayList<ProvinciaDTO>();
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IMaestrosDAO dao = factory.getMaestrosDAO();
            provincias = dao.listaProvincias(idPais);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoF) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_PROVINCIAS
                    + Constantes.SL + daoF.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_PROVINCIAS
                    + Constantes.SL + daoE.getMessage());
        }
        return provincias;
    }

    /**
     * Devuelve la lista de ciudades
     * @param	idProvincia El identificador del Provincia del que se quieren obtener las ciudades
     * @return  La lista de las ciudades que pertencen a la provincia indicada
     * @throws  RemoteException en caso de producirse un fallo de comunicaciones
     * @throws  GestorDiccionarioException En caso de producirse un error en el acceso
     *          a datos
     */
    public List<CiudadDTO> listaCiudades(int idProvincia) throws GestorDiccionarioException, RemoteException {
        List<CiudadDTO> ciudades = new ArrayList<CiudadDTO>();
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IMaestrosDAO dao = factory.getMaestrosDAO();
            ciudades = dao.listaCiudades(idProvincia);

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoF) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_CIUDADES
                    + Constantes.SL + daoF.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_CIUDADES
                    + Constantes.SL + daoE.getMessage());
        }
        return ciudades;
    }
    
    
    /**
     * Devuelve la lista de tipos de encuentro
     * @return  La lista de todos los tipos de encuentro de la aplicaci�n
     * @throws  RemoteException en caso de producirse un fallo de comunicaciones
     * @throws  GestorDiccionarioException En caso de producirse un error en el acceso
     *          a datos
     */
    public List<TipoEncuentroDTO> listaTiposEncuentro() throws GestorDiccionarioException, RemoteException {
        List<TipoEncuentroDTO> encuentros = new ArrayList<TipoEncuentroDTO>();
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IMaestrosDAO dao = factory.getMaestrosDAO();
            encuentros = dao.listaEncuentros();
            
//            IMaestrosDAO gE = new MaestrosDAO() {};
//            encuentros = gE.listaEncuentros();
            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoF) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_CIUDADES
                    + Constantes.SL + daoF.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_CIUDADES
                    + Constantes.SL + daoE.getMessage());
        }
        return encuentros;
    }
        /**
     * Devuelve la lista de tipos de caracteristicas fisicas
     * @return  La lista de todos los tipos de caracteristicas fisicas de la aplicaci�n
     * @throws  RemoteException en caso de producirse un fallo de comunicaciones
     * @throws  GestorDiccionarioException En caso de producirse un error en el acceso
     *          a datos
     */
    public List<CFisicaDTO> listaCFisicas() throws GestorDiccionarioException, RemoteException {
        List<CFisicaDTO> fisicas = new ArrayList<CFisicaDTO>();
        try {
//            IMaestrosDAO gE = new MaestrosDAO() {};
//            fisicas = gE.listaCFisicas();
            DAOFactory factory = DAOFactory.getDAOFactory();
            IMaestrosDAO dao = factory.getMaestrosDAO();
            fisicas = dao.listaCFisicas();

            // Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoF) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_CIUDADES
                    + Constantes.SL + daoF.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_CIUDADES
                    + Constantes.SL + daoE.getMessage());
        }
        return fisicas;
    }

    /**
     * Devuelve la lista de tipos de equipamiento
     * @return  La lista de todos los tipos de encuentro de la aplicaci�n
     * @throws  RemoteException en caso de producirse un fallo de comunicaciones
     * @throws  GestorDiccionarioException En caso de producirse un error en el acceso
     *          a datos
     */
    public List<EquipamientoDTO> listaEquipamiento() throws GestorDiccionarioException, RemoteException {
        List<EquipamientoDTO> equipamiento = new ArrayList<EquipamientoDTO>();
        try {
            DAOFactory factory = DAOFactory.getDAOFactory();
            IMaestrosDAO dao = factory.getMaestrosDAO();
            equipamiento = dao.listaEquipamiento();
//            IMaestrosDAO gE = new MaestrosDAO() {};
//            equipamiento = gE.listaEquipamiento();
            
//             Liberamos recursos
            factory = null;
            dao = null;

        } catch (DAOFactoryException daoF) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_CIUDADES
                    + Constantes.SL + daoF.getMessage());
        } catch (DataBaseDAOException daoE) {
            throw new GestorDiccionarioException(GestorDiccionarioException.ERROR_LISTA_CIUDADES
                    + Constantes.SL + daoE.getMessage());
        }
        return equipamiento;
    }

    @Override
    public List<TopDTO> listaTop() throws RemoteException, GestorDiccionarioException {
        
        List<TopDTO> listaTop = new ArrayList<TopDTO>();
        
        //Creamos los top por defecto - esto podr�a recogerse del fichero
        //de properties o de bbdd"Top
        TopDTO top = new TopDTO();
        top.setValue(Constantes.TOP_10);
        top.setTopText(Constantes.TOP_10_TXT);
        listaTop.add(top);
        
        top = new TopDTO();
        top.setValue(Constantes.TOP_20);
        top.setTopText(Constantes.TOP_20_TXT);
        listaTop.add(top);
        
        top = new TopDTO();
        top.setValue(Constantes.TOP_TODOS);
        top.setTopText(Constantes.TOP_TODOS_TXT);
        listaTop.add(top);
 
        return listaTop;
        
    }
}
